package com_1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectDemo3 {//定义一个反射类测试类
    public static void main(String[] args) throws Exception {//main方法入口抛出异常
        Class<?> c = Class.forName("com.Student");
        //通过Class.forname获取类的class文件对象以便通过反射操作类中方法，成员变量
        Constructor<?> cs = c.getConstructor();
        //通过class文件获取类中无参数构造方法
        Object o = cs.newInstance();//再通过无参数构造方法创建一个学生类对象
        Field namefield = c.getDeclaredField("name");
        //通过getfield获取类中的私有成员变量
        namefield.setAccessible(true);
        //暴力反射取消私有修饰符的作用
        namefield.set(o, "诸葛亮");
        //使用获取的成员变量对象通过set方法赋值
        System.out.println(o);//输出对象
        Field ifield = c.getDeclaredField("i");
        //通过class文件对象获取公共的成员变量
        ifield.setAccessible(true);
        //暴力反射，取消访问权限
        ifield.set(o, 26);
        //通过成员变量对象的set方法赋值
        System.out.println(o);
        //输出赋值的对象
        Field afield = c.getDeclaredField("a");
        //获取公共的成员变量，通过getdeclaredfield方法
        afield.setAccessible(true);
        //暴力反射取消私有访问权限
        afield.set(o, 45);
        //通过field对象的set方法赋值
        System.out.println(o);
        //输出对象

    }
}
